RxJava তে time-based এবং conditional operators ব্যবহার করে আপনি স্ট্রিমের উপর নির্দিষ্ট সময়ের ভিত্তিতে অপারেশন করতে পারেন এবং শর্ত (conditions) অনুসারে ডেটা প্রক্রিয়া করতে পারেন। এই অপারেশনগুলো অ্যাসিঙ্ক্রোনাস প্রোগ্রামিংয়ের ক্ষেত্রে আরও ফ্লেক্সিবল এবং কার্যকরী হতে সাহায্য করে। বিশেষত, যখন আপনি নির্দিষ্ট সময়ের মধ্যে ডেটা ইভেন্টগুলোর উপর কাজ করতে চান বা নির্দিষ্ট শর্ত অনুযায়ী কোনো অ্যাকশন ট্রিগার করতে চান, তখন এই অপারেশনগুলো অত্যন্ত উপকারী।
Time-based Operators
Time-based operators RxJava তে আপনাকে নির্দিষ্ট সময়ের ভিত্তিতে ডেটা প্রসেসিং করার সুবিধা দেয়। এটি সময়-ভিত্তিক স্ট্রিম তৈরি করতে ব্যবহার করা হয়, যেমন সময় নির্ধারণ করে সাবস্ক্রিপশন শুরু বা থামানো। কিছু প্রচলিত time-based operators হলো:
Delay
delay অপারেশনটি নির্দিষ্ট সময় (milliseconds বা seconds) পর্যন্ত একটি স্ট্রিমের আইটেম প্রক্রিয়া করার জন্য ব্যবহৃত হয়। এটি স্ট্রিমে আইটেম আসার আগে বিলম্ব (delay) যোগ করে।
Observable.just("Hello", "World")
.delay(2, TimeUnit.SECONDS) // 2 সেকেন্ড দেরি
.subscribe(System.out::println);
এখানে delay অপারেশনটি 2 সেকেন্ড পর "Hello" এবং "World" প্রিন্ট করবে।
Timer
timer অপারেশনটি একটি নির্দিষ্ট সময়ের পরে একটি একক আইটেম (যেমন 0) ইমিট করবে। এটি সাধারনত একক ইভেন্ট ট্রিগার করার জন্য ব্যবহৃত হয়।
Observable.timer(3, TimeUnit.SECONDS)
.subscribe(time -> System.out.println("Time's up!"));
এটি 3 সেকেন্ড পর "Time's up!" প্রিন্ট করবে।
Interval
interval অপারেশনটি একটি নির্দিষ্ট সময় ব্যবধানে ধারাবাহিকভাবে ডেটা ইভেন্ট উৎপন্ন করে। এটি নির্দিষ্ট সময়ের পর পর (যেমন প্রতি 1 সেকেন্ড) একটি আইটেম পাঠায়।
Observable.interval(1, TimeUnit.SECONDS)
.take(5) // 5টি ইভেন্ট নেবে
.subscribe(System.out::println);
এটি প্রতি সেকেন্ডে একটি সংখ্যা ইমিট করবে এবং 5টি ইভেন্টের পর সাবস্ক্রিপশন বন্ধ হয়ে যাবে।
Timer vs Interval
- Timer: একটি একক ইভেন্টের জন্য সময় নির্ধারণ করে।
- Interval: ধারাবাহিকভাবে সময় নির্ধারণ করে এবং অনেক ইভেন্ট তৈরি করে।
Conditional Operators
Conditional operators ব্যবহার করে আপনি রিঅ্যাকটিভ স্ট্রিমে বিভিন্ন শর্ত অনুযায়ী অপারেশন পরিচালনা করতে পারেন। এই অপারেশনগুলো স্ট্রিমের মধ্যে শর্ত (condition) চেক করতে সাহায্য করে এবং শুধুমাত্র সেগুলোই প্রসেস করে যেগুলো শর্ত পূর্ণ করবে।
Take
take অপারেশনটি একটি স্ট্রিম থেকে প্রথম N সংখ্যক আইটেম নেয়। এটি শর্ত হিসেবে একটি সংখ্যা ব্যবহার করে, যা জানায় কতগুলো আইটেম প্রয়োজন।
Observable.just(1, 2, 3, 4, 5)
.take(3) // প্রথম 3টি আইটেম নিবে
.subscribe(System.out::println);
এটি শুধুমাত্র 1, 2, এবং 3 প্রিন্ট করবে।
TakeWhile
takeWhile অপারেশনটি একটি শর্ত অনুসারে স্ট্রিম থেকে আইটেম নেবে যতক্ষণ না শর্তটি মিথ্যা হয়। এটি শর্ত পরীক্ষা করে এবং যখন শর্ত মিথ্যা হবে, তখন স্ট্রিমটি বন্ধ হয়ে যায়।
Observable.just(1, 2, 3, 4, 5)
.takeWhile(i -> i < 4) // যতক্ষণ না 4 এর চেয়ে ছোট, ততক্ষণ আইটেম নেবে
.subscribe(System.out::println);
এটি 1, 2, এবং 3 প্রিন্ট করবে, কারণ 4 এর পর আইটেমের মান শর্ত পূর্ণ করবে না।
Skip
skip অপারেশনটি একটি স্ট্রিম থেকে প্রথম N সংখ্যক আইটেম বাদ দিয়ে বাকি আইটেমগুলো নেয়। এটি শর্ত হিসেবে একটি সংখ্যা ব্যবহার করে, যা জানায় কতগুলো আইটেম বাদ দিতে হবে।
Observable.just(1, 2, 3, 4, 5)
.skip(2) // প্রথম 2টি আইটেম বাদ দিয়ে বাকি আইটেম নেবে
.subscribe(System.out::println);
এটি 3, 4, এবং 5 প্রিন্ট করবে, কারণ প্রথম দুটি আইটেম (1 এবং 2) বাদ দেওয়া হয়েছে।
Filter
filter অপারেশনটি একটি শর্তের মাধ্যমে স্ট্রিমে থাকা আইটেমগুলো ফিল্টার করে এবং শুধুমাত্র সেগুলো নেয় যেগুলো শর্ত পূর্ণ করে। এটি শর্ত হিসেবে একটি predicate ব্যবহার করে।
Observable.just(1, 2, 3, 4, 5)
.filter(i -> i % 2 == 0) // শুধু Even নম্বর নেবে
.subscribe(System.out::println);
এটি 2 এবং 4 প্রিন্ট করবে, কারণ এই দুটি নম্বর Even (যুগল)।
উপসংহার
RxJava তে time-based এবং conditional operators ব্যবহারের মাধ্যমে আপনি ডেটার প্রক্রিয়া আরও নির্ভুল এবং কার্যকরী করতে পারেন। time-based operators যেমন delay, interval, এবং timer সময়ভিত্তিক স্ট্রিমের জন্য কার্যকর, যেখানে conditional operators যেমন take, filter, এবং takeWhile ডেটার নির্দিষ্ট শর্ত অনুযায়ী ফিল্টারিং এবং সিলেকশন করতে সাহায্য করে। এই অপারেশনগুলো আপনার অ্যাসিঙ্ক্রোনাস বা রিঅ্যাকটিভ প্রোগ্রামিংয়ের দক্ষতা বাড়াতে সহায়ক হবে।